package com.all.common.gps;

import android.content.Context;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.preference.PreferenceManager;
import android.util.Log;

public class GpsLocation {

	protected String TAG = this.getClass().getName();
	
	private final long minTime = 10000;
	
	private final float minDistance = 10;
	//定位管理服务
	private LocationManager mLocationManager;
	//定位变更监听器
	private GpsLocationListener mLocListener;
	//GPS状态监听器
	private GpsStatusListener mGpsStatusListener;
	
	private Location mLocation;
	//判断是否开通了应用的GPS设置
	@SuppressWarnings("unused")
	private SharedPreferences mPreferences;
	
	String mProvider ; 
	
	int flag = 0;
	
	Context mContext;
	public GpsLocation(Context context)
	{
		mContext = context;
		mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
		mLocListener = new GpsLocationListener(mLocation);
		mGpsStatusListener = new GpsStatusListener(mLocationManager);
		
		location();
	}
	
	private void location()
	{
		Log.i(TAG, "start location.");
		mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
		mLocationManager.addGpsStatusListener(mGpsStatusListener);
		if(flag == 0)
		{
			/*
			 * 可以调用精确的设置
			 * 也可以调用系统默认的设置
			 *  通过getBestProvider获得满足要求的最佳供应商，也可以通过getProviders(criteria, true)获取符合要求的供应商列表。
			 * 在没有搜索到足够卫星时，系统会返回其他方式，如network。
			 * 定位返回的数据会比较慢，所以要等一会
			 * 在室内或手机设备不同的情况下可能会出现就算有卫星也无法定位的情况
			 * */
			//Criteria cirteria = new Criteria();
			Criteria cirteria = getCriteria();
			mProvider = mLocationManager.getBestProvider(cirteria, true);
			mLocation = mLocationManager.getLastKnownLocation(mProvider);

			mLocationManager.requestLocationUpdates(mProvider, minTime, minDistance, mLocListener);
			
		}else
			if(flag == 1)
			{
				/*
				 * 国内的网络无法访问GOOGLE的服务，所以一般来说无法使用网络定位
				 * 建议通过百度地图进行网络定位
				 * */
				/********百度地图定位  开始  代码还没有写*******/
				
				
			}
	}
	
	public void requertLoc()
	{
		mLocationManager.requestLocationUpdates(mProvider, minTime, minDistance, mLocListener);
	}
	
	public Location getLocation() {
		return mLocation;
	}
	public void setLocation(Location mLocation) {
		this.mLocation = mLocation;
	}
	
	 /** 
     * 返回查询条件 
     *  
     * @return 
     */  
    private Criteria getCriteria() {  
        Criteria criteria = new Criteria();  
        // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略，Criteria.ACCURACY_FINE则比较精细  
        criteria.setAccuracy(Criteria.ACCURACY_FINE);  
        // 设置是否要求速度  
        criteria.setSpeedRequired(false);
        //对速度的精确度
        //criteria.setSpeedAccuracy(criteria.ACCURACY_HIGH);
        // 设置是否允许运营商收费  
        criteria.setCostAllowed(false);  
        // 设置是否需要方位信息  
        criteria.setBearingRequired(false);  
        // 设置是否需要海拔信息  
        criteria.setAltitudeRequired(false);  
        // 设置对电源的需求  
        criteria.setPowerRequirement(Criteria.POWER_LOW);  
        return criteria;  
    }
    
    public void removeListener()
    {
    	if(mGpsStatusListener!=null)
    	{
    		mLocationManager.removeGpsStatusListener(mGpsStatusListener);
    		mLocationManager = null;
    	}
    	if(mLocListener!=null)
    	{
    		mLocationManager.removeUpdates(mLocListener);
    		mLocListener = null;
    	}
    	
    }
}
